package 进阶阶段;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.file.Files;
import java.nio.file.Paths;

public class demo25IO流_转换流 {
    public static void main(String[] args) throws Exception {
        //在IDEA中，使用FileReader读取模块(eclipse里面叫项目)中的含有中文的文本文件。由于IDEA的设置，都是默认的`UTF-8`编
        //码，所以没有任何问题。但是，当读取Windows系统中创建的含有中文的文本文件时，由于Windows系统的默认是GBK编码，就会出
        //现乱码。因为`GBK`里面一个中文两个字节,`UTF-8`一个中文三个字节!!!

        System.out.println("转换输入流InputStreamReader");

        //转换输入流InputStreamReader：是Reader的子类，是从字节流到字符流的桥梁。它读取字节，并使用指定的字符集.将其解码为字符。它的字符集,可以由名称指定，也可以接受平台的默认字符集。
            //InputStreamReader(InputStream in): 创建一个使用默认字符集的字符输入流。字节流到字符流的桥梁
            //InputStreamReader(InputStream in, String charsetName): 创建一个指定字符集的字符输入流。

//        InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt") , "gbk");//指定了编码是gbk，但是idea默认为UTF-8，所以读取出来的会乱码
        InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt") , "UTF-8");//idea中"UTF-8"可以不写
//        int ch;
//        while ((ch = isr.read()) != -1){
//            System.out.print((char) ch);
//        }

        System.out.println("转换输出流OutputStreamWriter");

        //转换流OutputStreamWriter：是Writer的子类，是从字符流到字节流的桥梁。使用指定的字符集,将字符编码为字节。它的字符集,可以由名称指定，也可以接受平台的默认字符集。
            //OutputStreamWriter(OutputStream in): 创建一个使用默认字符集的字符输出流。字符流到字节流的桥梁
            //OutputStreamWriter(OutputStream in, String charsetName): 创建一个指定字符集的字符输出流。

        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt") , "UTF-8");
        int ch;
        char[] arr = new char[1024];//从输入流中读取一些字节数，并将它们存储到字节数组arr中。
        while ((ch = isr.read(arr)) != -1){
            osw.write(arr , 0 , ch);
        }

        isr.close();
        osw.close();

        //总结:不出现乱码,把握一个原则即可:是什么样的文件就用什么编码来读写,通过转换流类的构造方法,字符串编码指定编码即可!!!

    }
}
